package algorithm_demo.demo04;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @author Api
 * @date 2023/2/15 21:03
 */
public class Code02_Test {
    /*
     * 一些项目要占用一个会议室宣讲，会议室不能同时容纳两个项目的宣讲。
     * 给你每一个项目开始的时间和结束的时间
     * 你来安排宣讲的日程，要求会议室进行的宣讲的场次最多
     * 返回最多的宣讲场次
     * */

    public static class Program {
        public int start;
        public int end;

        public Program(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }

    public static int bestArrange1(Program[] programs) {
        if (programs == null || programs.length == 0) {
            return 0;
        }
        return process(programs, 0, 0);
    }


    /*暴力穷举*/

    /**
     * 目前来到timeLine的时间点，已经安排了done多的会议，剩下的会议可以自由安排
     *
     * @param programs 还剩下什么会议放入programs里面
     * @param done     执行已经安排了多少会议的数量
     * @param timeLine 目前来到的时间点
     * @return 能安排的最多会议数量
     */
    public static int process(Program[] programs, int done, int timeLine) {
        if (programs.length == 0) {
            return done;
        }
        //还有会议可以选择
        int max = done;
        //当前安排的会议是什么会，每一个都枚举
        for (int i = 0; i < programs.length; i++) {
            if (programs[i].start >= timeLine) {
                Program[] next = copyButExcept(programs, i);
                max = Math.max(max, process(next, done + 1, programs[i].end));
            }
        }
        return max;
    }

    public static Program[] copyButExcept(Program[] programs, int i) {
        Program[] ans = new Program[programs.length - 1];
        int index = 0;
        for (int k = 0; k < programs.length; k++) {
            if (k != i) {
                ans[index++] = programs[k];
            }
        }
        return ans;
    }


    /*贪心算法*/
    public static class ProgramComparator implements Comparator<Program> {
        //根据谁的时间早来排序
        @Override
        public int compare(Program o1, Program o2) {
            return o1.end - o2.end;
        }
    }

    public static int bestArrange2(Program[] programs) {
        //根据谁结束的时间早来排序
        Arrays.sort(programs, new ProgramComparator());
        int timeLine = 0;
        int result = 0;
        for (int i = 0; i < programs.length; i++) {
            if (timeLine <= programs[i].start) {
                result++;
                timeLine = programs[i].end;
            }
        }
        return result;
    }
}
